package kr.pe.johnkim.pushchat.mobile.service;

import kr.pe.johnkim.pushchat.mobile.dao.PushChatChatDao;
import kr.pe.johnkim.pushchat.mobile.dao.PushChatUserDao;
import kr.pe.johnkim.pushchat.mobile.domain.PushChatChat;
import kr.pe.johnkim.pushchat.mobile.domain.PushChatUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author : John_Kim <cale9797@gmail.com>
 * @date : 13. 6. 12.
 */
@Service
public class PushChatChatServiceImpl implements PushChatChatService {

    // SLF4J Logging
    private Logger logger = LoggerFactory.getLogger(PushChatChatServiceImpl.class);

    @Autowired
    private PushChatChatDao pushChatChatDao;

    @Autowired
    private PushChatUserDao pushChatUserDao;

    /**
     * 채팅방 중복 확인을 한다. 참여자가 2명일때만 확인한다.
     *
     * @param pushChatChat
     * @return
     */
    @Override
    public PushChatChat selectChatDuplicate(PushChatChat pushChatChat) {
        logger.info("selectChatDuplicate");
        return this.pushChatChatDao.selectChatDuplicate(pushChatChat);
    }

    /**
     * 채팅방을 개설 한다.
     * 채팅방 개설과 사용자 추가를 한개의 transaction 으로 묶는다.
     *
     * 1. 채팅방을 개설 한다.
     * 2. 개설한 채팅방 정보를 가져 온다.
     * 3. 사용자를 추가 한다.
     *
     * @param pushChatChat
     */
    @Override
    public PushChatChat registerChatAndRegisterUser(PushChatChat pushChatChat) {
        logger.info("registerChatAndRegisterUser");

        // 1. 채팅방을 개설 한다.
        this.pushChatChatDao.registerChat(pushChatChat);

        // 2. 개설한 채팅방 정보를 가져 온다.
        PushChatChat chatInformation = this.pushChatChatDao.selectChatInformation(pushChatChat);

        logger.info("idChat : {}", chatInformation.getIdChat());
        logger.info("owner  : {}", chatInformation.getOwner());

        PushChatUser parameter = new PushChatUser();

        parameter.setMemberId(pushChatChat.getMemberId());
        parameter.setActivateYn(pushChatChat.getActivateYn());
        parameter.setModifyDate(pushChatChat.getModifyDate());
        parameter.setRegisterDate(pushChatChat.getRegisterDate());
//        parameter.setPushChatChatIdChat(chatInformation.getPushChatChatIdChat());
//        parameter.setPushChatChatOwner(chatInformation.getPushChatChatOwner());
        parameter.setPushChatChatIdChat(chatInformation.getIdChat());
        parameter.setPushChatChatOwner(chatInformation.getOwner());

        // 3. 사용자를 추가 한다.
        this.pushChatUserDao.registerUser(parameter);

        PushChatUser parameter2 = new PushChatUser();

        parameter2.setMemberId(pushChatChat.getMemberId());
        parameter2.setActivateYn(pushChatChat.getActivateYn());
        parameter2.setPushChatChatIdChat(chatInformation.getIdChat());
        parameter2.setPushChatChatOwner(chatInformation.getOwner());

        PushChatUser result2 = this.pushChatUserDao.selectUserInformation(parameter2);

        PushChatChat result = new PushChatChat();

        result.setIdChat(chatInformation.getIdChat());
        result.setOwner(chatInformation.getOwner());
        result.setIdUser(result2.getIdUser());

        return result;
    }

    /**
     * 채팅방 정보를 가져 온다. 채팅방을 개설할때 호출한다.
     *
     * @param pushChatChat
     * @return
     */
    @Override
    public PushChatChat selectChatInformation(PushChatChat pushChatChat) {
        logger.info("selectChatInformation");

        return  this.pushChatChatDao.selectChatInformation(pushChatChat);
    }

    /**
     * 채팅방 목록을 가져 온다.
     *
     * @param pushChatChat
     * @return
     */
    @Override
    public List<PushChatChat> selectChatList(PushChatChat pushChatChat) {
        logger.info("selectChatList");

        return this.pushChatChatDao.selectChatList(pushChatChat);
    }

    /**
     * 채팅방을 비활성화 한다.
     *
     * @param pushChatChat
     */
    @Override
    public void updateDeactivateChat(PushChatChat pushChatChat) {
        logger.info("updateDeactivateChat");
        this.pushChatChatDao.updateDeactivateChat(pushChatChat);
    }
}
